# 人工智能NLP-Agent数字人项目-02-日程提醒任务工单V1.1-20250215
import abc
import sqlite3
import re
from typing import Any
from langchain.tools import BaseTool

# 数据库文件路径常量
DB_FILE = 'timer.db'

class MyTimer(BaseTool, abc.ABC):
    name: str = "MyTimer"
    description: str = ("用于设置日程。接受3个参数，格式为: HH:MM|YYYYYYY|事项内容，所用标点符号必须为标准的英文字符。"
                        "其中，'HH:MM' 表示时间（24小时制），'YYYYYYY' 表示循环规则（每位代表一天，从星期一至星期日，1为循环，0为不循环，"
                        "如'1000100'代表每周一和周五循环），'事项内容' 是提醒的具体内容。返回例子：15:15|0000000|提醒主人叫咖啡")

    def __init__(self):
        super().__init__()
        # 初始化时创建表，如果表不存在
        self._create_table()

    def _create_table(self):
        """创建 timer 表，如果表不存在"""
        try:
            with sqlite3.connect(DB_FILE) as conn:
                cursor = conn.cursor()
                cursor.execute("""
                    CREATE TABLE IF NOT EXISTS timer (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        time TEXT NOT NULL,
                        repeat_rule TEXT NOT NULL,
                        content TEXT NOT NULL
                    )
                """)
        except sqlite3.Error as e:
            print(f"创建表时出错: {e}")

    async def _arun(self, *args: Any, **kwargs: Any) -> Any:
        # 用例中没有用到 arun 不予具体实现
        pass

    def _run(self, para: str) -> str:
        try:
            # 验证输入格式
            time, repeat_rule, content = self._validate_input(para)
            # 插入数据到数据库
            self._insert_data(time, repeat_rule, content)
            return "日程设置成功"
        except ValueError as e:
            return str(e)
        except sqlite3.Error as e:
            return f"数据库错误: {e}"

    def _validate_input(self, para: str):
        """验证输入格式"""
        parts = para.split("|")
        if len(parts) != 3:
            raise ValueError(f"输入格式错误，当前字符串{para} len:{len(parts)}。请按照 HH:MM|YYYYYYY|事项内容 格式提供参数，如：15:15|0000001|提醒主人叫咖啡。")

        time = parts[0].strip("'")
        repeat_rule = parts[1].strip("'")
        content = parts[2].strip("'")

        # 验证时间格式
        if not re.match(r'^[0-2][0-9]:[0-5][0-9]$', time):
            raise ValueError("时间格式错误。请按照'HH:MM'格式提供时间。")

        # 验证循环规则格式
        if not re.match(r'^[01]{7}$', repeat_rule):
            raise ValueError("循环规则格式错误。请提供长度为7的0和1组成的字符串。")

        # 验证事项内容
        if not isinstance(content, str) or not content:
            raise ValueError("事项内容必须为非空字符串。")

        return time, repeat_rule, content

    def _insert_data(self, time: str, repeat_rule: str, content: str):
        """插入数据到数据库"""
        with sqlite3.connect(DB_FILE) as conn:
            cursor = conn.cursor()
            cursor.execute("INSERT INTO timer (time, repeat_rule, content) VALUES (?, ?, ?)", (time, repeat_rule, content))
            conn.commit()

if __name__ == "__main__":
    my_timer = MyTimer()
    result = my_timer._run("15:15|0000001|提醒主人叫咖啡")
    print(result)